package tt.dz.egobus.servicemanager.service;

import tt.dz.egobus.api.ResponseBack;
import tt.dz.egobus.api.exception.ResponseException;
import tt.dz.egobus.api.managerservice.manager.*;
import tt.dz.egobus.servicemanager.business.point.AddressPoint;
import tt.dz.egobus.servicemanager.business.point.BusPoint;
import tt.dz.egobus.servicemanager.entities.BusinessService;
import tt.dz.egobus.servicemanager.entities.BusinessServiceInfo;
import tt.dz.egobus.servicemanager.vo.BusinessFinishVo;
import tt.dz.egobus.servicemanager.vo.BusinessRequestVo;

import java.util.List;

/**
 * @author Anson
 * @date 17-3-21
 * @name 管理服务层
 * @since 1.0.2
 */
public interface ManagerService {
    /**
     * @param busId
     * @param driverId
     * @author Anson
     * @date 17-3-21
     * @name 激活司机
     * 校验用户有效性
     * 校验车辆的有效性以及状态有效性
     * @since 1.0.2
     */
    ResponseBack<Boolean> active(String busId, String driverId);

    /**
     * @param driverId 当前司机的id
     * @return 当前是否下线成功
     * @throws ResponseException 司机状态异常的时候
     * @author Anson
     * @date 17-3-21
     * @name 司机下线
     * @since 1.0.2
     */
    ResponseBack<Boolean> down(String driverId);

    /**
     * @param driverId          司机id
     * @param businessId        业务请求id
     * @param busPoint          当前司机接受派单坐标地址
     * @param businessRequestVo 业务请求vo
     * @throws ResponseException 司机绑定的状态异常的时候
     * @author Anson
     * @date 17-3-27
     * @name 业务开始
     * @since 1.0.3
     */
    ResponseBack<Boolean> doBeginBusiness(String driverId, String businessId, String userId,
                                          BusPoint busPoint, BusinessRequestVo businessRequestVo);

    /**
     * @param driverId        司机id
     * @param businessService 业务
     * @param addressPoint    当前坐标
     * @author Anson
     * @date 17-3-28
     * @name 更新当前业务的状态, 并上报当前地理位置
     * @since 1.0.3
     */
    ResponseBack<Boolean> doBusiness(String driverId, BusinessService businessService, AddressPoint addressPoint);

    /**
     * @param businessId 司机id
     * @ResponseException 当前业务流水号为空
     * @author Anson
     * @date 17-3-28
     * @name 获取账单信息
     * @since 1.0.3
     */
    ResponseBack<TaskInfo> getTaskInfo(String businessId);

    /**
     * @param vo 业务完成的请求vo
     * @author Anson
     * @date 17-3-29
     * @name
     * @since 1.0.3
     */
    ResponseBack<BusinessServiceInfo> doFinish(BusinessFinishVo vo);

    /**
     * @param userId     用户id
     * @param businessId 业务流水号
     * @author Anson
     * @date 17-3-29
     * @name 用户取消了
     * @since 1.0.3
     */
    ResponseBack<Boolean> doUserCancel(String userId, String businessId);

    /**
     * @param orderId    订单id
     * @param businessId 业务流水号
     * @param status     当前订单状态
     * @author Anson
     * @date 17-3-30
     * @name
     * @since 1.0.3
     */
    ResponseBack<Boolean> modifyBusinessOrderStatus(String businessId, String orderId, int status);

    /**
     * @param alert 当前异常请求
     * @author Anson
     * @date 17-3-30
     * @name 司机异常请求上报
     * @since 1.0.3
     */
    ResponseBack<Boolean> doSaveBusinessExceptionAlert(ExceptionRequest alert);

    /**
     * @param pointDistance 当前距离的起始经纬度
     * @param businessCode  业务服务号
     * @author Anson
     * @date 17-3-30
     * @name 判断当前两点距离是否超过了业务规定距离
     * true:已经超过了;false:未超过
     * @since 1.0.3
     */
    ResponseBack<Boolean> isOverMaxDistance(PointDistance pointDistance, int businessCode);

    /**
     * @author Anson
     * @date 17-3-31
     * @name 查询系统中配置的业务服务号状态
     * @since 1.0.3
     */
    ResponseBack<List<BusinessCodeServiceStatus>> queryBusinessCodeServiceInfo();

    /**
     * @param businessCode 业务服务号
     * @author Anson
     * @date 17-3-31
     * @name 查询某个服务号是否已经激活了
     * @since 1.0.3
     */
    ResponseBack<Boolean> isBusinessCodeActive(int businessCode);

    /**
     * @param userId 用户id
     * @author Anson
     * @date 17-4-1
     * @name 判断某个用户是否含有未完成的业务流程
     * @since 1.0.3
     */
    ResponseBack<Boolean> isExitUserUnDoneBusiness(String userId);

    /**
     * @param userId 用户id
     * @author Anson
     * @date 17-4-1
     * @name 用户当前未完成业务拍单信息
     * @since 1.0.3
     */
    ResponseBack<TaskInfo> getUserUnDoneTaskInfo(String userId);

    /**
     * @param driverId
     * @author Anson
     * @date 17-4-1
     * @name 司机当前未完成业务拍单信息
     * @since 1.0.3
     */
    ResponseBack<TaskInfo> getDriverUnDoneTaskInfo(String driverId);

    /**
     * @param driverId 司机id
     * @author Anson
     * @date 17-4-11
     * @name 查询司机最近一次派单信息（包含已完成和未完成）
     * @since 1.0.4
     */
    ResponseBack<TaskInfo> getDriverLastestTaskInfo(String driverId);

    /**
     * @param driverId 司机id
     * @author Anson
     * @date 17-4-11
     * @name 司机有效派单总数
     * @since 1.0.4
     */
    ResponseBack<Integer> getDriverBusinesCount(String driverId);

    /**
     * @param businessCodes 业务码数组
     * @param driverId      司机id
     * @author Anson
     * @date 17-4-12
     * @name 计算司机的在不同的业务服务下的服务次数
     * 返回结果中与请求中业务码一一对应
     * @since 1.0.4
     */
    ResponseBack<Integer[]> queryDriverBusinessCodeCount(Integer[] businessCodes, String driverId);

    /**
     * @author Anson
     * @date 17-4-12
     * @name 获取当前系统约定的最大距离数，单位为米/M
     * @since 1.0.4
     */
    ResponseBack<Integer> getSystemAllMaxDistanceLength();

    /**
     * @param businessId 业务号
     * @author Anson
     * @date 17-5-16
     * @name 通过业务号获取对应有效的业务视图信息
     * @since 1.0.4
     */
    BusinessView getServiceViewByBusinessId(String businessId);

}
